home *** CD-ROM | disk | FTP | other *** search
- package org.flintparticles.emitters
- {
- import flash.display.DisplayObject;
- import flash.display.Shape;
- import flash.events.Event;
- import flash.events.EventDispatcher;
- import flash.geom.Point;
- import flash.utils.getTimer;
- import org.flintparticles.actions.Action;
- import org.flintparticles.activities.Activity;
- import org.flintparticles.counters.Counter;
- import org.flintparticles.counters.ZeroCounter;
- import org.flintparticles.events.FlintEvent;
- import org.flintparticles.initializers.Initializer;
- import org.flintparticles.particles.Particle;
- import org.flintparticles.particles.ParticleCreator;
- import org.flintparticles.particles.ParticleFactory;
- import org.flintparticles.renderers.Renderer;
- import org.flintparticles.utils.DisplayObjectUtils;
- import org.flintparticles.utils.Maths;
-
- public class Emitter extends EventDispatcher
- {
-
- protected static var _creator:ParticleCreator = new ParticleCreator();
-
-
- protected var _x:Number = 0;
-
- protected var _actionsPriority:Array;
-
- protected var _particlesPriority:Array;
-
- protected var _activities:Array;
-
- protected var _renderer:Renderer;
-
- private var _ticker:Shape;
-
- private var _time:int;
-
- protected var _particles:Array;
-
- protected var _initializers:Array;
-
- protected var _counter:Counter;
-
- protected var _actions:Array;
-
- public var spaceSort:Boolean = false;
-
- protected var _activitiesPriority:Array;
-
- public var spaceSortedX:Array;
-
- protected var _rotation:Number = 0;
-
- protected var _particleFactory:ParticleFactory;
-
- protected var _initializersPriority:Array;
-
- protected var _maximumFrameTime:Number = 0.5;
-
- protected var _y:Number = 0;
-
- public function Emitter()
- {
- _x = 0;
- _y = 0;
- _rotation = 0;
- _maximumFrameTime = 0.5;
- spaceSort = false;
- super();
- _particleFactory = _creator;
- _particles = new Array();
- _actions = new Array();
- _initializers = new Array();
- _activities = new Array();
- _particlesPriority = new Array();
- _actionsPriority = new Array();
- _initializersPriority = new Array();
- _activitiesPriority = new Array();
- _counter = new ZeroCounter();
- _ticker = new Shape();
- }
-
- public function set rotation(param1:Number) : void
- {
- _rotation = Maths.asRadians(param1);
- }
-
- public function addInitializer(param1:Initializer, param2:Number = NaN) : void
- {
- var _loc3_:int = 0;
- if(isNaN(param2))
- {
- param2 = param1.getDefaultPriority();
- }
- _loc3_ = 0;
- while(_loc3_ < _initializersPriority.length)
- {
- if(_initializersPriority[_loc3_] < param2)
- {
- break;
- }
- _loc3_++;
- }
- _initializers.splice(_loc3_,0,param1);
- _initializersPriority.splice(_loc3_,0,param2);
- param1.addedToEmitter(this);
- }
-
- public function get y() : Number
- {
- return _y;
- }
-
- public function set renderer(param1:Renderer) : void
- {
- _renderer = param1;
- }
-
- public function rendererGlobalToLocal(param1:Point) : Point
- {
- var _loc2_:Point = null;
- _loc2_ = param1.clone();
- if(_renderer is DisplayObject)
- {
- _loc2_ = DisplayObject(_renderer).globalToLocal(_loc2_);
- }
- return _loc2_;
- }
-
- public function get maximumFrameTime() : Number
- {
- return _maximumFrameTime;
- }
-
- public function get rotRadians() : Number
- {
- return _rotation;
- }
-
- protected function frameUpdate(param1:Number) : void
- {
- var _loc2_:int = 0;
- var _loc3_:Particle = null;
- var _loc4_:int = 0;
- var _loc5_:Action = null;
- var _loc6_:int = 0;
- var _loc7_:int = 0;
- _loc4_ = int(_counter.updateEmitter(this,param1));
- _loc2_ = 0;
- while(_loc2_ < _loc4_)
- {
- createParticle();
- _loc2_++;
- }
- if(spaceSort)
- {
- spaceSortedX = _particles.sortOn("x",Array.NUMERIC | Array.RETURNINDEXEDARRAY);
- _loc4_ = int(_particles.length);
- _loc2_ = 0;
- while(_loc2_ < _loc4_)
- {
- _particles[spaceSortedX[_loc2_]].spaceSortX = _loc2_;
- _loc2_++;
- }
- }
- _loc4_ = int(_activities.length);
- _loc2_ = 0;
- while(_loc2_ < _loc4_)
- {
- _activities[_loc2_].update(this,param1);
- _loc2_++;
- }
- if(_particles.length > 0)
- {
- _loc4_ = int(_actions.length);
- _loc6_ = int(_particles.length);
- _loc7_ = 0;
- while(_loc7_ < _loc4_)
- {
- _loc5_ = _actions[_loc7_];
- _loc2_ = 0;
- while(_loc2_ < _loc6_)
- {
- _loc3_ = _particles[_loc2_];
- _loc5_.update(this,_loc3_,param1);
- _loc2_++;
- }
- _loc7_++;
- }
- _loc2_ = _loc6_;
- while(_loc2_--)
- {
- _loc3_ = _particles[_loc2_];
- if(_loc3_.isDead)
- {
- destroyParticle(_loc3_);
- _particles.splice(_loc2_,1);
- }
- }
- }
- else
- {
- dispatchEvent(new FlintEvent(FlintEvent.EMITTER_EMPTY));
- }
- if(_renderer)
- {
- _renderer.renderParticles(_particles);
- }
- }
-
- public function get counter() : Counter
- {
- return _counter;
- }
-
- public function set y(param1:Number) : void
- {
- _y = param1;
- }
-
- public function get particleFactory() : ParticleFactory
- {
- return _particleFactory;
- }
-
- public function dispose() : void
- {
- var _loc1_:int = 0;
- var _loc2_:int = 0;
- _ticker.removeEventListener(Event.ENTER_FRAME,frameLoop);
- _loc1_ = int(_particles.length);
- _loc2_ = 0;
- while(_loc2_ < _loc1_)
- {
- destroyParticle(_particles[_loc2_]);
- _loc2_++;
- }
- _particles.length = 0;
- }
-
- private function destroyParticle(param1:Particle) : void
- {
- dispatchEvent(new FlintEvent(FlintEvent.PARTICLE_DEAD,param1));
- if(_renderer)
- {
- _renderer.removeParticle(param1);
- }
- _particleFactory.disposeParticle(param1);
- }
-
- public function rendererLocalToGlobal(param1:Point) : Point
- {
- var _loc2_:Point = null;
- _loc2_ = param1.clone();
- if(_renderer is DisplayObject)
- {
- _loc2_ = DisplayObject(_renderer).localToGlobal(_loc2_);
- }
- return _loc2_;
- }
-
- public function get particles() : Array
- {
- return _particles;
- }
-
- protected function createParticle() : Particle
- {
- var _loc1_:Particle = null;
- var _loc2_:int = 0;
- var _loc3_:int = 0;
- _loc1_ = _particleFactory.createParticle();
- _loc2_ = int(_initializers.length);
- _loc1_.x = _x;
- _loc1_.y = _y;
- _loc1_.rotation = _rotation;
- _loc3_ = 0;
- while(_loc3_ < _loc2_)
- {
- _initializers[_loc3_].initialize(this,_loc1_);
- _loc3_++;
- }
- _particles.push(_loc1_);
- if(_renderer)
- {
- _renderer.addParticle(_loc1_);
- }
- dispatchEvent(new FlintEvent(FlintEvent.PARTICLE_CREATED,_loc1_));
- return _loc1_;
- }
-
- public function set maximumFrameTime(param1:Number) : void
- {
- _maximumFrameTime = param1;
- }
-
- public function set rotRadians(param1:Number) : void
- {
- _rotation = param1;
- }
-
- public function addAction(param1:Action, param2:Number = NaN) : void
- {
- var _loc3_:int = 0;
- if(isNaN(param2))
- {
- param2 = param1.getDefaultPriority();
- }
- _loc3_ = 0;
- while(_loc3_ < _actionsPriority.length)
- {
- if(_actionsPriority[_loc3_] < param2)
- {
- break;
- }
- _loc3_++;
- }
- _actions.splice(_loc3_,0,param1);
- _actionsPriority.splice(_loc3_,0,param2);
- param1.addedToEmitter(this);
- }
-
- private function frameLoop(param1:Event) : void
- {
- var _loc2_:int = 0;
- var _loc3_:Number = NaN;
- _loc2_ = _time;
- _time = getTimer();
- _loc3_ = (_time - _loc2_) * 0.001;
- if(_loc3_ <= _maximumFrameTime)
- {
- frameUpdate(_loc3_);
- }
- }
-
- private function addDisplayObject(param1:DisplayObject) : void
- {
- var _loc2_:Particle = null;
- var _loc3_:int = 0;
- var _loc4_:int = 0;
- var _loc5_:DisplayObject = null;
- var _loc6_:Point = null;
- var _loc7_:Number = NaN;
- _loc2_ = _particleFactory.createParticle();
- _loc3_ = int(_initializers.length);
- _loc4_ = 0;
- while(_loc4_ < _loc3_)
- {
- _initializers[_loc4_].initialize(this,_loc2_);
- _loc4_++;
- }
- _loc5_ = _renderer as DisplayObject;
- if(Boolean(param1.parent) && Boolean(_loc5_))
- {
- _loc6_ = _loc5_.globalToLocal(param1.localToGlobal(new Point(0,0)));
- _loc2_.x = _loc6_.x;
- _loc2_.y = _loc6_.y;
- _loc7_ = DisplayObjectUtils.globalToLocalRotation(_loc5_,DisplayObjectUtils.localToGlobalRotation(param1,0));
- _loc2_.rotation = Maths.asRadians(_loc7_);
- param1.parent.removeChild(param1);
- }
- else
- {
- _loc2_.x = param1.x;
- _loc2_.y = param1.y;
- _loc2_.rotation = Maths.asRadians(param1.rotation);
- }
- _loc2_.image = param1;
- _particles.unshift(_loc2_);
- _renderer.addParticle(_loc2_);
- }
-
- public function resume() : void
- {
- _ticker.removeEventListener(Event.ENTER_FRAME,frameLoop);
- _ticker.addEventListener(Event.ENTER_FRAME,frameLoop);
- _time = getTimer();
- }
-
- public function removeActivity(param1:Activity) : void
- {
- var _loc2_:int = 0;
- _loc2_ = 0;
- while(_loc2_ < _activities.length)
- {
- if(_activities[_loc2_] == param1)
- {
- _activities.splice(_loc2_,1);
- _activitiesPriority.splice(_loc2_,1);
- param1.removedFromEmitter(this);
- return;
- }
- _loc2_++;
- }
- }
-
- public function get renderer() : Renderer
- {
- return _renderer;
- }
-
- public function removeInitializer(param1:Initializer) : void
- {
- var _loc2_:int = 0;
- _loc2_ = 0;
- while(_loc2_ < _initializers.length)
- {
- if(_initializers[_loc2_] == param1)
- {
- _initializers.splice(_loc2_,1);
- _initializersPriority.splice(_loc2_,1);
- param1.removedFromEmitter(this);
- return;
- }
- _loc2_++;
- }
- }
-
- public function set particleFactory(param1:ParticleFactory) : void
- {
- _particleFactory = param1;
- }
-
- public function addActivity(param1:Activity, param2:Number = NaN) : void
- {
- var _loc3_:int = 0;
- if(isNaN(param2))
- {
- param2 = param1.getDefaultPriority();
- }
- _loc3_ = 0;
- while(_loc3_ < _activitiesPriority.length)
- {
- if(_activitiesPriority[_loc3_] < param2)
- {
- break;
- }
- _loc3_++;
- }
- _activities.splice(_loc3_,0,param1);
- _activitiesPriority.splice(_loc3_,0,param2);
- param1.addedToEmitter(this);
- }
-
- public function removeAction(param1:Action) : void
- {
- var _loc2_:int = 0;
- _loc2_ = 0;
- while(_loc2_ < _actions.length)
- {
- if(_actions[_loc2_] == param1)
- {
- _actions.splice(_loc2_,1);
- _actionsPriority.splice(_loc2_,1);
- param1.removedFromEmitter(this);
- return;
- }
- _loc2_++;
- }
- }
-
- public function start() : void
- {
- var _loc1_:int = 0;
- var _loc2_:int = 0;
- _ticker.removeEventListener(Event.ENTER_FRAME,frameLoop);
- _ticker.addEventListener(Event.ENTER_FRAME,frameLoop);
- _time = getTimer();
- _loc1_ = int(_activities.length);
- _loc2_ = 0;
- while(_loc2_ < _loc1_)
- {
- _activities[_loc2_].initialize(this);
- _loc2_++;
- }
- _loc1_ = int(_counter.startEmitter(this));
- _loc2_ = 0;
- while(_loc2_ < _loc1_)
- {
- createParticle();
- _loc2_++;
- }
- }
-
- public function set x(param1:Number) : void
- {
- _x = param1;
- }
-
- public function addDisplayObjects(... rest) : void
- {
- var _loc2_:Number = NaN;
- var _loc3_:Number = NaN;
- _loc2_ = 0;
- while(_loc2_ < rest.length)
- {
- if(rest[_loc2_] is Array)
- {
- _loc3_ = 0;
- while(_loc3_ < rest[_loc2_].length)
- {
- if(rest[_loc2_][_loc3_] is DisplayObject)
- {
- addDisplayObject(rest[_loc2_][_loc3_]);
- }
- _loc3_++;
- }
- }
- else if(rest[_loc2_] is DisplayObject)
- {
- addDisplayObject(rest[_loc2_]);
- }
- _loc2_++;
- }
- }
-
- public function pause() : void
- {
- _ticker.removeEventListener(Event.ENTER_FRAME,frameLoop);
- }
-
- public function get x() : Number
- {
- return _x;
- }
-
- public function runAhead(param1:Number, param2:Number = 10) : void
- {
- var _loc3_:Number = NaN;
- pause();
- _loc3_ = 1 / param2;
- while(param1 > 0)
- {
- param1 -= _loc3_;
- frameUpdate(_loc3_);
- }
- resume();
- }
-
- public function get rotation() : Number
- {
- return Maths.asDegrees(_rotation);
- }
-
- public function set counter(param1:Counter) : void
- {
- _counter = param1;
- }
- }
- }
-